package com.yugao.fintech.libra.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yugao.fintech.libra.model.entity.SysUser;
import com.yugao.fintech.libra.model.vo.tenant.TenantResp;
import com.yugao.fintech.libra.model.vo.tenant.TenantUserResp;
import com.yugao.fintech.libra.model.vo.user.*;
import com.yugao.fintech.libra.system.model.entity.SysTenantUser;
import com.yugao.fintech.libra.model.vo.dept.DeptResp;
import com.yugao.fintech.libra.system.model.rqrs.tenant.*;

import java.util.List;
import java.util.Map;


public interface TenantUserService extends IService<SysTenantUser> {
    /**
     * 获取全部租户下的用户
     * @param req 参数
     */
    IPage<TenantUserResp> pageAllTenantUser(UserBasePageReq req);

    /**
     * 查询当前租户下的数据
     */
    IPage<UserResp> pageUser(UserBasePageReq req);

    /**
     * 根据 userIds查询，查询用户所属部门的名称（多个部门名逗号隔开）
     */
    Map<Long, String> listDeptNamesByUserIds(List<Long> userIds);

    /**
     * 通过用户ID查询用户
     * @param userId 用户id
     * @return 用户信息
     */
    UserResp getUserById(Long userId);


    /**
     * 获取用户部门
     * @param userId 用户id
     * @return 结果
     */
    List<DeptResp> listUserDept(Long userId);

    /**
     * 修改用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    boolean updateById(SysUser user);

    /**
     * 从租户中移除删除用户
     *
     * @param userIds 需要删除的用户ID
     */
    void deleteUserByIds(List<Long> userIds);

    /**
     * 校验用户是否允许操作
     */
    void checkUserAllowed(Long userId);

    /**
     * 导入用户数据
     *
     * @param userList 用户数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @param operName 操作用户
     * @return 结果
     */
    String importUser(List<UserSaveReq> userList, Boolean isUpdateSupport, String operName);

    /**
     * 查询角色中的用户
     * @param req 请求数据
     */
    List<UserResp> listRoleUser(RoleUserListReq req);

    /**
     * 列出部门中的用户
     */
    IPage<DeptUserResp> pageDeptUser(DeptUserBasePageReq req);

    /**
     * 为租户分配用户
     */
    void assignUser(TenantUserAddReq req);

    List<Long> listUserIdsByRoleId(Long roleId);

    List<UserResp> listUserByIds(List<Long> userIds);

    /**
     * 获取当前登录用户的租户信息(有效租户)
     * 该方法仅查询有效的租户，如果返回0个就说明所有的租户均无效。
     */
    List<TenantResp> listUserTenant();

    /**
     * 展示树型结构
     */
    List<TenantResp> listUserTenantTree();

    /**
     * 切换租户
     */
    SwitchTenantResp switchTenant(SwitchTenantReq req);

    /**
     * 选择登录租户
     */
    SwitchTenantResp selectLoginTenant(SelectLoginTenantReq req);

    /**
     * 初始化租户信息
     */
    void initTenant(Long tenantId);
}
